﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using SistemaCenterQuimPost.Control;   //Se usa para validar los datos.
using SistemaCenterQuimPost.Plantillas; //necesario para obtener fecha, nombre usuario etc,


namespace SistemaCenterQuimPost.UI
{
    public partial class frmIngresoDinero : SistemaCenterQuimPost.Plantillas.frmPlantillaHijo
    {
        //-------ATRIBUTOS---------------------

        private DataSet2 CenterQuimDs;
        private DataSet2TableAdapters.CajasTableAdapter CajasTa;
        private DataSet2TableAdapters.IngresosxCajaTableAdapter IngresosTa;

        private int nroCaja;        //almacenará el numero de caja sobre la cual impactan los ingresos.

        private string turno;        //almacenamos el turno de la caja actualmente abierta.



        //--------CONSTRUCTORES-----------------

        public frmIngresoDinero(int ancho, int alto) //frmIngresoDinero usan tanto Administrador y Supervisor. Ambos con diferentes
        {                                       //tamaños. Este se recibe en el constructor.
            InitializeComponent();

            this.CenterQuimDs = new DataSet2();
            this.CajasTa = new DataSet2TableAdapters.CajasTableAdapter();
            this.IngresosTa = new DataSet2TableAdapters.IngresosxCajaTableAdapter();

            this.Width = ancho;
            this.Height = alto;
            this.MinimumSize = new System.Drawing.Size(ancho, alto); //Se establece el tamaño máximo y mínimo en pixeles.
            this.MaximumSize = new System.Drawing.Size(ancho, alto);

            nroCaja = 0;                         //Se inicializa el numero de caja con un valor arbitrario.
        }


        //-------ESTADOS------------------------
        private void IngresoDinero_Load(object sender, EventArgs e)
        {

        }

        private void estEsperandoOperacion()  //estado cuando se inicia la interface, luego de llenar_dgv
        {
            lblFechaValor.Text = obtenerFechaActual();

            lblTurnoValor.Text = this.turno;

            lblCajeroValor.Text = this.getNombreUsuarioCajaAbierta(CenterQuimDs.Cajas[0].codUsuarioApertura);

            lblMontoAcumValor.Text = CenterQuimDs.Cajas[0].ingresos.ToString();

            txtMontoActual.Text = "";


            errorProvider1.Clear();

            txtMontoActual.Focus();

            this.lblError.Visible = false; //como es un formulario de un solo estado, este atributo se setea acá.


        }

        //-------METODOS VARIOS-----------------

        public void verificarCajaAbierta()  //Verifica que exista caja y que esté abierta, es llamado desde el menu.
        {
            try
            {
                int codUltimaCaja = 0;  //almacenará el código de la última caja, si existe.

                codUltimaCaja = Convert.ToInt32(CajasTa.ScalarQueryCaja()); //busca la ultima caja si hay registros.

                CajasTa.FillByNroCaja(CenterQuimDs.Cajas, codUltimaCaja); //obtiene todos los datos de la ultima caja


                if (CenterQuimDs.Cajas[0].estado == "A") // si la caja está abierta 
                {
                    this.nroCaja = CenterQuimDs.Cajas[0].nroCaja; //establece el valor del atributo de instancia.

                    this.turno = CenterQuimDs.Cajas[0].turno;

                    this.estEsperandoOperacion();

                    this.Show();  //muestra la interface.

                }

                else   //Si existe caja y está cerrada, informamos que no se procesar ingresos hasta que habra alguna.
                {
                    MessageBox.Show("No existe caja abierta, en la que pueda registrar ingresos.", "INFORMES", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    
                    this.Close(); //cerramos y de esta forma desligamos con la coleccion de menu
                
                }
            }

            catch (IndexOutOfRangeException)  //excepcion cuando no encuentra registro en la base de datos caja.
            {
                MessageBox.Show("Aún no se han abierto ninguna caja, por lo tanto no puede registrar ingresos.", "INFORMES", MessageBoxButtons.OK, MessageBoxIcon.Information);

                this.Close(); //cerramos y de esta forma desligamos con la coleccion de menu
            
            }

            catch (Exception ex)
            {
                //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
        }


        private void btnProcesar_Click(object sender, EventArgs e)
        {
            if (formularioValido())
            {
                agregarIngreso();

            }
            else
            {
                informarExistenciaError();
            }
        }

        private void agregarIngreso()
        {
            DialogResult result = MessageBox.Show("¿Está seguro que desea registrar el ingreso en la caja actual?.", "CONFIRMACION INGRESO", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (result == DialogResult.Yes)
            {
                try
                {
                    //CONSULTA DE INSERT EN TABLA INGRESOS, A LOS DATOS DE TIPO STRING SE LE SACA LOS ESPACIOS BLANCOS AL PRINICIPIO Y FINAL, LUEGO SE CONVIERTE A MAYUSCULA.
                    //adaptadorIngreso.InsertQueryIngreso(,...,...,)

                    IngresosTa.InsertQueryIngresoxCaja(this.nroCaja, Convert.ToDecimal(txtMontoActual.Text), txtConcepto.Text.Trim().ToUpper(), obtenerCodUsuarioActual());

                    agregarIngresoCaja(Convert.ToDouble(txtMontoActual.Text));  //actualiza la caja por el monto del ingreso.

                    //Se muestra un mje de confirmación.
                    MessageBox.Show("Gasto ingresado con exito!!!", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);


                    estEsperandoOperacion(); //Luego de insertar un usuario se vuelve al estado esperando operación
                }

                catch (IndexOutOfRangeException)
                {
                    //Se informe que no se encontró nada porque el argumento de busqueda esta fuera del rango.
                    MessageBox.Show("Su consulta no ha arrojado resultados.", "INFORME", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    //Si llega a ocurrir algún error en estado agregar
                    estEsperandoOperacion();
                }
                catch (Exception ex)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("La conexión a la base de datos no fué exitosa. /n /n Comuniquese con su desarrollador para solucionar el problema /n /n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    //Si llega a ocurrir algún error en estado agregar 
                    this.estEsperandoOperacion();
                }

            }
        }

        private void agregarIngresoCaja(double unMontoIngreso)
        {
            CajasTa.FillByNroCaja(CenterQuimDs.Cajas, this.nroCaja);   //se obtienen los datos de la caja 

            CenterQuimDs.Cajas[0].ingresos = CenterQuimDs.Cajas[0].ingresos + unMontoIngreso;  //aumenta el campo ingreso por el monto.

            CenterQuimDs.Cajas[0].cajaFinal = CenterQuimDs.Cajas[0].cajaFinal + unMontoIngreso; //aumenta la caja final por el monto

            CajasTa.Update(CenterQuimDs.Cajas);

            CajasTa.FillByNroCaja(CenterQuimDs.Cajas, this.nroCaja);  //se deja actualizado la tabla caja en el dataSet
        }


        private string obtenerFechaActual()  //Dato necesario para la apertura de una caja.
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getFechaActual();
        }

        private int obtenerCodUsuarioActual()  //Dato necesario para la apertura de una caja
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getCodUsuario();
        }

        private string getNombreUsuarioCajaAbierta(int codUsuarioApertura) //método que obtiene el usuario de una caja abierta.
        {
            DataSet2 UsuariosDs = new DataSet2();
            DataSet2TableAdapters.UsuariosTableAdapter UsuariosDa = new DataSet2TableAdapters.UsuariosTableAdapter();

            try
            {
                UsuariosDa.FillByCodigoUsuario(UsuariosDs.Usuarios, codUsuarioApertura);

                return UsuariosDs.Usuarios[0].nombreUsuario;

            }

            catch (IndexOutOfRangeException)
            {
                return "Usuario ya eliminado.";

            }

            catch (Exception)
            {
                return "";

            }

        }

        private bool formularioValido()  //valida que los txtConcepto y txtImporte sean 
        {
            validarMontoActual();

            validarConcepto();


            if ((errorProvider1.GetError(txtMontoActual) == "") && (errorProvider1.GetError(txtConcepto) == ""))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private void validarMontoActual()
        {
            if (txtMontoActual.Text.Trim() == "")
            {
                errorProvider1.SetError(txtMontoActual, "Monto Actual: el campo se encuentra vacio\n\n");
            }
            else
            {

                errorProvider1.SetError(txtMontoActual, new ValidarDatos().validarMoneda("Monto Actual:", txtMontoActual.Text));
            }
        }

        private void validarConcepto()
        {
            errorProvider1.SetError(txtConcepto, new ValidarDatos().validarLongitud("Concepto:", txtConcepto.Text, 50));

        }



    }
}
